package ru.averta.notes.service.security.token;

import ru.averta.notes.other.UtilsApi;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * <code>ApiFailureAuthFilter</code>
 *
 * В случае неудачной аудентификации по API (неверный логин + пароль / неверный токен)
 * возвращает ответ с ошибкой 401
 *
 * @author fedor.belov (fedor.belov@mail.ru)
 *         Date: 08.09.11 17:42
 */
public class ApiFailureAuthFilter implements Filter {
    @Override public void init(FilterConfig filterConfig) throws ServletException {
    }

    /**
     * В случае, если запрос к API, требуещему аудентификацию, а удентификация не была пройдена удачно,
     * клиенту возвращается ответ с ошибкой 401
     *
     * Иначе продолжение цепочки продолжается
     *
     * @param request
     * @param response
     * @param chain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        if (UtilsApi.isRestrictedApiRequest((HttpServletRequest) request)) {
            if (!UtilsApi.isSuccessfulAuth(request)) {
                sendFailureAuthResponse((HttpServletResponse) response);
            } else {
                chain.doFilter(request, response);
            }
        } else {
            chain.doFilter(request, response);
        }

    }

    private void sendFailureAuthResponse(HttpServletResponse response) throws IOException {
        response.sendError(response.SC_UNAUTHORIZED, "Username / password / token is incorrect");
    }

    @Override public void destroy() {
    }
}
